package io.kiki.stack.http.feign.form;

import lombok.Getter;
import lombok.experimental.FieldDefaults;
import lombok.val;

import static lombok.AccessLevel.PRIVATE;

/**
 * Supported content types.
 *
 * @author Artem Labazin
 */
@Getter
@FieldDefaults(level = PRIVATE, makeFinal = true)
public enum ContentType {

    /**
     * Unknown content type.
     */
    UNDEFINED("undefined"),
    /**
     * Url encoded content type.
     */
    URLENCODED("application/x-www-form-urlencoded"),
    /**
     * Multipart form data content type.
     */
    MULTIPART("multipart/form-data");

    String header;

    ContentType(String header) {
        this.header = header;
    }

    /**
     * Parses string to content type.
     *
     * @param str string representation of content type.
     * @return {@link ContentType} instance or {@link ContentType#UNDEFINED}, if there is no such
     * content type.
     */
    public static ContentType of(String str) {
        if (str == null) {
            return UNDEFINED;
        }

        val trimmed = str.trim();
        for (val type : values()) {
            if (trimmed.startsWith(type.getHeader())) {
                return type;
            }
        }
        return UNDEFINED;
    }
}
